AtCoder Beginner Contest 262 题解
全部标签简要题意线段上有\(V\)个村庄,现在要建\(P\)个邮局,使每个村庄到最近的邮局的距离之和最小。50分做法设\(dp[i][j]\)表示第一个村庄到第\(i\)个村庄,建了\(j\)个邮局的最小距离,不难得出状态转移方程:\(dp[i][j]=min(dp[k][j-1]+w[k+1][i])\),其中\(w[i][j]\)表示在第\(i\)和\(j\)个村庄之间建一个邮局的最短总距离。根据初中知识不难求得,邮局建在第\(i\)到\(j\)个村庄的中位数的位置上(奇数个村庄)或第\(i\)到\(j\)个村庄的两个中位数之间(偶数个村庄),则总距离最短,因此我们可以递推求出\(w[i][j]\
注意到\(\sum\limits_{i=2}^N|x_{p_i}-x_{p_{i-1}}|+|y_{p_i}-y_{p_{i-1}}|\)。本质上是两个点之间的曼哈顿距离。而曼哈顿最小距离生成树要\(O(n^2\logn)\),显然过不了。注意到我们写过一个叫莫队的东西。而莫队的复杂度为\(O(n\sqrtn)\),也就是我们要求的东西。加一点小优化,奇偶排序。就可以过了。怎么证明?可以看一看这一篇博客精简来说就是控制了左右指针跨越块的数量。#includeusingnamespacestd;constintmaxn=1000001;structquery{intl,r,id;}q[maxn]
注意到\(\sum\limits_{i=2}^N|x_{p_i}-x_{p_{i-1}}|+|y_{p_i}-y_{p_{i-1}}|\)。本质上是两个点之间的曼哈顿距离。而曼哈顿最小距离生成树要\(O(n^2\logn)\),显然过不了。注意到我们写过一个叫莫队的东西。而莫队的复杂度为\(O(n\sqrtn)\),也就是我们要求的东西。加一点小优化,奇偶排序。就可以过了。怎么证明?可以看一看这一篇博客精简来说就是控制了左右指针跨越块的数量。#includeusingnamespacestd;constintmaxn=1000001;structquery{intl,r,id;}q[maxn]
Givemeyourmoney!!1「我的做题历程」:step1:观察题面。 「编写一个函数来计算可以凑成总金额」,可以得出这是一道背包DP。 「每种硬币的数量是无限的」,进一步得出这是道完全背包。(题型:完全背包) 「最少的硬币个数」,证明这要在背包的前提下,求出最小组成数量。 「多组测试数据」,谨记多组输入(论WrongAnswer与没有多组输入)。(注意:多组输入)step2:思考解法。 第一步,思考dp状态:\(dp_{i,j}\):前\(i\)种硬币凑出面值\(j\)的最少币数。 对于当前一种硬币\(coins_{i}\)而言,只有取或不取两种状态。 若取,取后的币数为
Givemeyourmoney!!1「我的做题历程」:step1:观察题面。 「编写一个函数来计算可以凑成总金额」,可以得出这是一道背包DP。 「每种硬币的数量是无限的」,进一步得出这是道完全背包。(题型:完全背包) 「最少的硬币个数」,证明这要在背包的前提下,求出最小组成数量。 「多组测试数据」,谨记多组输入(论WrongAnswer与没有多组输入)。(注意:多组输入)step2:思考解法。 第一步,思考dp状态:\(dp_{i,j}\):前\(i\)种硬币凑出面值\(j\)的最少币数。 对于当前一种硬币\(coins_{i}\)而言,只有取或不取两种状态。 若取,取后的币数为
\(0.\)前言有一天\(Au\)爷讲期望都见到了此题,通过写题解来加深理解。\(1.\)题意将初始为空的序列的末尾给定概率添加\(a\)或\(b\),当至少有\(k\)对\(ab\)时停止(注意是“对”,中间可以间隔字符),求\(ab\)期望对数。\(2.\)思路通过查看标签通过阅读题面我们容易发现本题是一道期望DP,但是本题的状态并不很容易想到,设\(f[i][j]\)表示前缀中有\(i\)个\(a\),\(j\)个\(ab\)停止后的期望个数,这样发现转移就容易了很多,不会被\(a\)和\(b\)纠缠不清,设\(A=pa/(pa+pb)\),\(B=pb/(pa+pb)\),则有:\[f
\(0.\)前言有一天\(Au\)爷讲期望都见到了此题,通过写题解来加深理解。\(1.\)题意将初始为空的序列的末尾给定概率添加\(a\)或\(b\),当至少有\(k\)对\(ab\)时停止(注意是“对”,中间可以间隔字符),求\(ab\)期望对数。\(2.\)思路通过查看标签通过阅读题面我们容易发现本题是一道期望DP,但是本题的状态并不很容易想到,设\(f[i][j]\)表示前缀中有\(i\)个\(a\),\(j\)个\(ab\)停止后的期望个数,这样发现转移就容易了很多,不会被\(a\)和\(b\)纠缠不清,设\(A=pa/(pa+pb)\),\(B=pb/(pa+pb)\),则有:\[f
Atcoder链接:CoinsLuogu链接:Coins$\scr{\color{BlueViolet}{Solution}}$观察数据,发现$\cal{n}\le3000$,说明$Ο(\cal{n^2})$可过,容易想到DP。用$\cal{dp[i][j]}$表示抛完第$\cal{i}$个硬币时,有$\cal{j}$个硬币正面朝上的概率。 考虑$\cal{dp[i][j]}$如何转移,易发现有以下两种情况,(当前正面朝上概率为$\cal{p_i}$):本次抛得硬币是正面:抛到正面概率乘抛完第$\cal{i-1}$个硬币后,有$j-1$个硬币朝上的概率。本次抛得硬币是反面:抛到反面概率乘抛完第
Atcoder链接:CoinsLuogu链接:Coins$\scr{\color{BlueViolet}{Solution}}$观察数据,发现$\cal{n}\le3000$,说明$Ο(\cal{n^2})$可过,容易想到DP。用$\cal{dp[i][j]}$表示抛完第$\cal{i}$个硬币时,有$\cal{j}$个硬币正面朝上的概率。 考虑$\cal{dp[i][j]}$如何转移,易发现有以下两种情况,(当前正面朝上概率为$\cal{p_i}$):本次抛得硬币是正面:抛到正面概率乘抛完第$\cal{i-1}$个硬币后,有$j-1$个硬币朝上的概率。本次抛得硬币是反面:抛到反面概率乘抛完第
题目来源面试题02.05.链表求和题目详情给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7->1->6)+(5->9->2),即617+295输出:2->1->9,即912进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:输入:(6->1->7)+(2->9->5),即617+295输出:9->1->2,即912题解分析题目的要求是对链表的节点进行求和。题目的难点在于两个链表的长度可能不同,而且每个节点只能存放一个数位的元素。这里最直接的解法就是模拟法,或者叫做遍历法,同